(** Abstract name for a local variable (or a formal parameter)
    that is temporarily held in a register *)
type t [@@deriving compare, equal, show]

(** Abstract name for a static memory address
    that is yet to be determined *)
type label = Symbol.t [@@deriving compare, equal, show]

(** Returns a new temporary from
    an infinite set of temporaries *)
val mk : unit -> t

(** Returns a new named temporary from
    an infinite set of temporaries *)
val mk_named : string -> t

(** Returns a new [label], whose assembly-language name is
    the given string (if given), otherwise it is generated *)
val mk_label : string option -> label

(** Returns a [string] representation of the
    given [t] (useful for tracing) *)
val print_temp : t -> string

(** Returns a [string] representation of the
    given label (useful for tracing) *)
val print_label : label -> string
